package controllers

import (
	"bigbackend/models"
	"bigbackend/utils"
	"context"
	"errors"
	"net/http"

	"github.com/gin-gonic/gin"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
)

var (
	client     *mongo.Client
	ctx        context.Context
	collection *mongo.Collection
)

// 数据库初始化
func connectMongo() {
	client, ctx = utils.MongoConnect()
	collection = client.Database("big_data").Collection("admin_account")
}

// AdminRegister 管理员注册
func AdminRegister(c *gin.Context) {
	var admin models.AdminAccount
	err := c.ShouldBindJSON(&admin)

	//管理员注册信息不合法
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code":    -1,
			"message": "注册失败,用户信息不合法",
			"data":    err.Error(),
		})
		return
	}

	//查找管理员是否已存在
	filter := bson.D{
		{"name", admin.Name},
	}

	var result models.AdminAccount
	err = collection.FindOne(ctx, filter).Decode(&result)
	if errors.Is(err, mongo.ErrNoDocuments) {
		// 不存在，尝试插入管理员
		one, err := collection.InsertOne(ctx, admin)
		if err != nil {
			// 系统异常
			c.JSON(http.StatusBadRequest, gin.H{
				"code":    -1,
				"message": "注册失败，系统异常",
				"data":    err.Error(),
			})
			return
		}
		// 注册成功
		c.JSON(http.StatusOK, gin.H{
			"code":    0,
			"message": "注册成功",
			"data":    one,
		})
	} else if err != nil {
		// 查询出错
		c.JSON(http.StatusInternalServerError, gin.H{
			"code":    -1,
			"message": "查询重复管理员失败",
			"data":    err.Error(),
		})
		return
	} else {
		// 账号已存在
		c.JSON(http.StatusBadRequest, gin.H{
			"code":    -1,
			"message": "管理员账号已存在",
			"data":    "",
		})
	}

}

// AdminLogin 管理员登录
func AdminLogin(c *gin.Context) {
	connectMongo()
	var admin models.AdminAccount
	err := c.ShouldBindJSON(&admin)
	if err != nil {
		// 系统异常
		c.JSON(http.StatusBadRequest, gin.H{
			"code":    -1,
			"message": "登录失败，数据不合法",
			"data":    err.Error(),
		})
		return
	}
	filter := bson.D{
		{"name", admin.Name},
	}
	// 查询管理员是否存在
	var result models.AdminAccount
	err = collection.FindOne(ctx, filter).Decode(&result)
	if err != nil {
		if errors.Is(err, mongo.ErrNoDocuments) {
			c.JSON(http.StatusBadRequest, gin.H{
				"code":    -1,
				"message": "登录失败，用户不存在",
				"data":    err.Error(),
			})
			return
		}
		c.JSON(http.StatusBadRequest, gin.H{
			"code":    -1,
			"message": "登录失败，系统异常",
			"data":    err.Error(),
		})
		return
	}
	filter = bson.D{
		{"name", admin.Name},
		{"password", admin.Password},
	}
	err = collection.FindOne(ctx, filter).Decode(&result)
	if err != nil {
		if errors.Is(err, mongo.ErrNoDocuments) {
			c.JSON(http.StatusBadRequest, gin.H{
				"code":    -1,
				"message": "登录失败，账号或密码错误",
				"data":    err.Error(),
			})
		}
		c.JSON(http.StatusBadRequest, gin.H{
			"code":    -1,
			"message": "登录失败，系统异常",
			"data":    err.Error(),
		})
		return
	}

}

// GetAllAdmin 查询所有管理员
func GetAllAdmin(c *gin.Context) {
	connectMongo()
	cursor, err := collection.Find(ctx, bson.D{})
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code":    -1,
			"message": "查询失败,查询数据异常",
			"data":    err.Error(),
		})
	}
	defer cursor.Close(ctx)

	var accounts []models.AdminAccount
	for cursor.Next(ctx) {
		var account models.AdminAccount
		if err := cursor.Decode(&account); err != nil {
			c.JSON(http.StatusBadRequest, gin.H{
				"code":    -1,
				"message": "包装数据异常",
				"data":    err.Error(),
			})
		}
		accounts = append(accounts, account)
	}

	if err := cursor.Err(); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code":    -1,
			"message": "游标异常",
			"data":    err.Error(),
		})
	}
	c.JSON(http.StatusOK, gin.H{
		"code":    0,
		"message": "查询成功",
		"data":    accounts,
	})

}

// GetAdminInfo 查询管理员信息
func GetAdminInfo(c *gin.Context) {
	connectMongo()

}

// UpdateAdmin 修改管理员信息
func UpdateAdmin(c *gin.Context) {
	connectMongo()

}

// UpdateAdminAvatar 修改管理员头像
func UpdateAdminAvatar(c *gin.Context) {
	connectMongo()

}

// UpdateAdminPwd 修改管理员密码
func UpdateAdminPwd(c *gin.Context) {
	connectMongo()

}
